<?php
// ********************************************
// 
// Пользователи. Регистрация, профиль, авторизация.
//
// ********************************************
require_once('tools.class.php');

class Customer 
{
    protected $db;
    private static $error = '<b>Извините. </b>На сайте возникли трудности технического характера.<br>Обратитесь за помощью к администратору сайта.';

    public function __construct( $database_handler) {
        $this->db = $database_handler;
    }
    
    public function Register()
    {

        $uname    = isset($_REQUEST["uname"]) ? strip_tags($_REQUEST["uname"]) : '';
        $email    = isset($_REQUEST["email"]) ? strip_tags($_REQUEST["email"]) : '';
        $passw    = isset($_REQUEST["passw"]) ? $_REQUEST["passw"] : '';
        $passw_re = isset($_REQUEST["passw_re"]) ? $_REQUEST["passw_re"] : '';
        $phone    = isset($_REQUEST["phone"]) ? strip_tags($_REQUEST["phone"]) : '';
        $captcha  = isset($_REQUEST["captcha"]) ? strip_tags($_REQUEST["captcha"]) : '';

        $errmess = "";
		$errcode = 0;
        $data = "";
        
        while (true)
        {
			if( isset($_SESSION['cust_id']) ) {
				$errmess = "Для повторной регистрации Вы должны выйти из системы"; 
				$errcode = 2; break;
			}
            if( !$uname || !$email || !$passw || !$passw_re || !$phone || !$captcha ) {
                $errmess = "Все поля обязательны для заполнения.";
				$errcode = 2;
                break;
            }

             if( $this->db == NULL ) {
                $errmess = self::$error;
				$errcode = 1;
                break;
            }
            $db = $this->db;
            
            $email = strtolower( $email );
            if( !Tools::is_mail_address( $email ) ) {
                $errmess = "Недопустимая запись E-Mail адреса.";
				$errcode = 2; break;
            }
            if( strlen($passw) < 6 )  { 
                $errmess = "Длинна пароля не может быть меньше 6-ти символов.";
				$errcode = 2; break;
            }
            if( $passw != $passw_re ) {
                $errmess = "'Пароль' и 'Пароль(повторно)' не совпадают.";
				$errcode = 2; break;
            }
			$phone = preg_replace("/[^0-9]/", '', $phone );
            if( strlen($phone) != 10 ) {
                $errmess = "Номер телефона указан неверно.";
				$errcode = 2; break;
            } 
            $captcha = strtolower( $captcha );
            if( $captcha != $_SESSION['secpic'] ) { 
                $errmess = "Неверно указазан код, показанный на картинке." ;
				$errcode = 2; break;
            }
            
// Проверяем существование
            $sqlreq = "SELECT COUNT(*) AS count FROM customers WHERE email=".$db->quote($email);
            $recset = $db->query( $sqlreq );
            $row = $recset->fetch(PDO::FETCH_ASSOC);
            $count = $row['count'];
            $recset->closeCursor();
            if ($count > 0) {
                $errmess = "Извините. Пользователь с указанным E-Mail адресом уже существует.";
				$errcode = 2; break;
            }

			$plain_passw = $passw;
            $mdsum = md5( $email );
            $passw = md5( $passw );
            $regdate = strftime("%Y-%m-%d %H:%M:%S");
            
            $sqlreq = "INSERT INTO customers (uname, email, passw, phone, mdsum, regdate, status) VALUES (".
                $db->quote($uname).", ".$db->quote($email).", ".$db->quote($passw).", ".
                $db->quote($phone).", ".$db->quote($mdsum).", ".$db->quote($regdate).", '0')";

            if( $db->exec($sqlreq) === false ){
                $errmess = self::$error;
				$errcode = 1; break;
            }

            $sitename = $_SESSION['sitename'];
			$slashpos = strpos( $sitename, '/' );
			$servname = ( $slashpos === false ) ? $sitename : substr($sitename, 0, $slashpos);
            $confirm = "http://".$sitename."/confirm.php?q=".$mdsum;
            
            $mbody = <<<EOD
Здравствуйте ${uname} !
Вы зарегистрировались на сайте ${servname}.
Для завершения процедуры регистрации Вам необходимо перейти по указанной ниже ссылке.
${confirm}
Данная ссылка будет действительна на протяжении 24-х часов.

Ваши данные для входа.
E-mail: ${email}
Пароль: ${plain_passw}

В случае, если данное сообщение попало к Вам ошибочно - приносим Вам свои извинения,
и просим удалить это сообщение немедленно.

С уважением. Администрация сайта ${servname}             
EOD;
            if( preg_match("/.*\s\<(.*)\>$/", $_SESSION['sitemail'], $matches) )
                $sitemail = $matches[1];
            else
                $sitemail = $_SESSION['sitemail'];
                
            $headers  = 'MIME-Version: 1.0'."\r\n".
                        'Content-type: text/plain; charset=UTF-8'."\r\n".
                        "From: ".$_SESSION['sitemail']."\r\n";
  
            mail(
                $email, 
                '=?UTF-8?B?'.base64_encode("Подтверждение регистрации").'?=', 
                $mbody, 
                $headers,
                "-f".$sitemail
            );
          
//            Tools::mail_utf8( $email, "Подтверждение регистрации", $mbody, $headers );
            
            $data = "На указанный Вами E-mail адрес выслано сообщение<br>".
                    "Для завершения регистрации выполните указанные в нем действия.<br>".
                    "В случае, если по какой либо причине Вы не получили это соощение -<br>".
                    "устраните причину и выполните регистрацию повторно.";
                    
            break;
        }

        Tools::json_response( $errmess, $errcode, $data );            
        return;
    }

    public function Restore()
    {

        $email    = isset($_REQUEST["email"]) ? strip_tags($_REQUEST["email"]) : '';

        $errmess = "";
		$errcode = 0;
        $data = "";
        
        while (true)
        {
			if( isset($_SESSION['cust_id']) ) {
				$errmess = "Первоначально выйдите из системы";
				$errcode = 2; break;
			}
            if( !$email ) {
                $errmess = "Укажите E-Mail, заданный при регистрации.";
				$errcode = 2; break;
            }

            if( $this->db == NULL ) {
                $errmess = self::$error;
				$errcode = 1; break;
            }
            $db = $this->db;
            
            $email = strtolower( $email );
            if( !Tools::is_mail_address( $email ) ) {
                $errmess = "Недопустимая запись E-Mail адреса.";
				$errcode = 2; break;
            }

            $sqlreq = "SELECT cust_id, uname, status FROM customers WHERE email=".$db->quote($email);
					
            $recset = $db->query( $sqlreq );
            $row = $recset->fetch(PDO::FETCH_ASSOC);
			
			if( !$row ) {
                $errmess = "E-Mail адрес задан неверно.";
				$errcode = 2; break;
			}
			
            $cust_id = $row['cust_id'];
            $uname = $row['uname'];
            $status = $row['status'];
            $recset->closeCursor();
            
            if ($status == 0) {
                $errmess = "Ваш акаунт еще не активирован.";
				$errcode = 2; break;
            }
            
// Генерим временный пароль
			$plain_passw = Tools::passw_gen(8);
            $passw = md5( $plain_passw );
            
            $sqlreq = "UPDATE customers SET ".
					"passw=".$db->quote($passw)." ".
					"WHERE cust_id=".$db->quote($cust_id);

            if( $db->exec($sqlreq) === false ){
                $errmess = self::$error;
				$errcode = 1; break;
            }

// Высылаем уведомление
            $sitename = $_SESSION['sitename'];
            
            $mbody = <<<EOD
Увазаемый ${uname} !
Вы запросили процедуру восстановления пароля на сайте ${sitename}.
Мы установили для Вас новый пароль, который Вы можете изменить в дальнейшем.

Ваши данные для входа.
E-mail: ${email}
Пароль: ${plain_passw}

В случае, если данное сообщение попало к Вам ошибочно - приносим Вам свои извинения,
и просим удалить это сообщение немедленно.

С уважением. Администрация сайта ${sitename}             
EOD;
            if( preg_match("/.*\s\<(.*)\>$/", $_SESSION['sitemail'], $matches) )
                $sitemail = $matches[1];
            else
                $sitemail = $_SESSION['sitemail'];
                
            $headers  = 'MIME-Version: 1.0'."\r\n".
                        'Content-type: text/plain; charset=UTF-8'."\r\n".
                        "From: ".$_SESSION['sitemail']."\r\n";
  
            mail(
                $email, 
                '=?UTF-8?B?'.base64_encode("Восстановление пароля.").'?=', 
                $mbody, 
                $headers,
                "-f".$sitemail
            );
          
//            Tools::mail_utf8( $email, "Подтверждение регистрации", $mbody, $headers );
            
            $data = "На указанный Вами E-mail адрес выслано сообщение,<br>".
                    "в котором указан Ваш новый пароль.";
                    
            break;
        }

        Tools::json_response( $errmess, $errcode, $data );            
        return;
    }

    public function Confirmation() {
        $success = '<b>Поздравляем !!!</b><br>Вы успешно завершили процедуру регистрации.';
        $error1 = '<b>Извините. </b>На сайте возникли трудности технического характера.<br>'.
                  'Обратитесь за помощью к администратору сайта.';
        $error2 = '<b>Извините. </b><br>Но Ваш запрос не может быть выполнен.';
        $error3 = '<b>Извините. </b><br>Но Вы пытаетесь повторно подтвердить регистрацию.';
        $error4 = '<b>Извините. </b><br>Но время для подтверждения регистрации просрочено.';

        $mdsum = isset($_REQUEST["q"]) ? $_REQUEST["q"] : '';
        $errmess = "";
        
        while(true) {
            if( $this->db == NULL ) {
                $errmess = $error1; break;
            }
            $db = $this->db;
            
            if( $mdsum == '' ) {
                $errmess = $error2; break;
            }
            
            $sqlreq = "SELECT COUNT(*) AS count FROM customers WHERE mdsum=".$db->quote($mdsum);
            $recset = $db->query( $sqlreq );
            $row = $recset->fetch(PDO::FETCH_ASSOC);
            $count = $row['count'];
            $recset->closeCursor();
            if ($count != 1) {
                $errmess = $error2; break;
            }
            $sqlreq = "SELECT cust_id, regdate, status FROM customers WHERE mdsum=".$db->quote($mdsum);
            $recset = $db->query( $sqlreq );
            $row = $recset->fetch(PDO::FETCH_ASSOC);
            $regdate = $row['regdate'];
            $status = $row['status'];
            $cust_id = $row['cust_id'];
            $recset->closeCursor();
            
            if ($status != 0) {
                $errmess = $error3; break;
            }
            
            $regtime = strtotime( $regdate );
            $sutki = 24*3600;
            if( time() - $regtime > $sutki ) {
                $errmess = $error4; break;
            }

            $sqlreq = "UPDATE customers SET status=1 WHERE cust_id=".$cust_id;
            if( $db->exec($sqlreq) === false ){
                $errmess = $error1; break;
            }
            
            break;
        }
        if( $errmess )
            echo $errmess;
        else
            echo $success;
    }

	public function Logout() {
        unset($_SESSION['cust_id']);
        unset($_SESSION['uname']);
        Tools::json_response( '', 0, '' );            
	}
	
    public function Login() {

        $email = isset($_REQUEST["email"]) ? $_REQUEST["email"] : '';
        $passw = isset($_REQUEST["passw"]) ? $_REQUEST["passw"] : '';
		
        $errmess = "";
		$errcode = 0;
		$data = "";
        
        while(true) {
            if( isset($_SESSION['cust_id']) ) {
                $errmess = "Вы уже вошли в систему под именем ".$_SESSION['uname'];
				$errcode = 2; break;
            }
            if (!$email || !$passw ) {
                $errmess = "Все поля обязательны для заполнения.";
				$errcode = 2; break;
            }

            if( $this->db == NULL ) {
                $errmess = self::$error;
				$errcode = 1; break;
            }
            $db = $this->db;
            
            $email = strtolower( $email );
            if( !Tools::is_mail_address( $email ) ) {
                $errmess = "Недопустимая запись E-Mail адреса.";
				$errcode = 2; break;
            }
			
            $sqlreq = "SELECT cust_id, uname, status FROM customers WHERE email=".$db->quote($email).
					" AND passw=".$db->quote(md5($passw));
					
            $recset = $db->query( $sqlreq );
            $row = $recset->fetch(PDO::FETCH_ASSOC);
			
			if( !$row ) {
                $errmess = "Пользователь не найден. Повторите ввод данных.";
				$errcode = 2; break;
			}
			
            $cust_id = $row['cust_id'];
            $uname = $row['uname'];
            $status = $row['status'];
            $recset->closeCursor();
            
            if ($status == 0) {
                $errmess = "Ваш акаунт не активирован.";
				$errcode = 2; break;
            }
            
            $lastdate = strftime("%Y-%m-%d %H:%M:%S");
			
            $sqlreq = "UPDATE customers SET lastdate=".$db->quote($lastdate)." WHERE cust_id=".$cust_id;
            if( $db->exec($sqlreq) === false ){
                $errmess = self::$error;
				$errcode = 1; break;
            }
            
			$data = array('cust_id'=>$cust_id, 'uname'=>$uname );
			
			$_SESSION['uname'] = $uname;
			$_SESSION['cust_id'] = $cust_id;
			
            break;
        }
        Tools::json_response( $errmess, $errcode, $data );            
	}
    
    public function ReadProfile() {

        $errmess = "";
		$errcode = 0;
		$data = "";
        
        while(true) {

			if( !isset( $_SESSION['cust_id'] ) || !$_SESSION['cust_id'] ) {
				$errmess = "Вы не выполнили вход в систему<br>или Ваша сессия закончилась по таймауту."; 
				$errcode = 999; break;
			}
			$cust_id =  $_SESSION['cust_id'];
			
			if( $this->db == NULL ) {
                $errmess = self::$error;
				$errcode = 1; break;
            }
            $db = $this->db;
            
            $sqlreq = "SELECT * FROM customers WHERE cust_id=".$db->quote($cust_id);
					
            $recset = $db->query( $sqlreq );
            $row = $recset->fetch(PDO::FETCH_ASSOC);
			
			if( !$row ) {
                $errmess = self::$error;
				$errcode = 1; break;
			}
            if ($row['status'] == 0) {
                $errmess = "Ваш акаунт не активирован.";
				$errcode = 2; break;
            }
			
            $data = array( 'cust_id'=>$row['cust_id'], 'uname'=>$row['uname'], 
						'email'=>$row['email'], 'phone'=>$row['phone'] );
            $recset->closeCursor();            
            
            break;
        }
        Tools::json_response( $errmess, $errcode, $data );            
	}

    public function UpdateProfile()
    {

        $uname    = isset($_REQUEST["uname"]) ? strip_tags($_REQUEST["uname"]) : '';
        $email    = isset($_REQUEST["email"]) ? strip_tags($_REQUEST["email"]) : '';
        $passw    = isset($_REQUEST["passw"]) ? $_REQUEST["passw"] : '';
        $passw_re = isset($_REQUEST["passw_re"]) ? $_REQUEST["passw_re"] : '';
        $phone    = isset($_REQUEST["phone"]) ? strip_tags($_REQUEST["phone"]) : '';

        $errmess = "";
		$errcode = 0;
        $data = "";
        
        while (true)
        {
			if( !isset( $_SESSION['cust_id'] ) || !$_SESSION['cust_id'] ) {
				$errmess = "Вы не выполнили вход в систему<br>или Ваша сессия закончилась по таймауту."; 
				$errcode = 999; break;
			}
			$cust_id =  $_SESSION['cust_id'];

			if (!$uname || !$email || !$passw || !$passw_re || !$phone ) {
                $errmess = "Все поля обязательны для заполнения.";
				$errcode = 2; break;
            }
            if( $this->db == NULL ) {
                $errmess = "Ошибка соединения с базой данных.";
				$errcode = 1; break;
            }
            $db = $this->db;
            
            $email = strtolower( $email );
            if( !Tools::is_mail_address( $email ) ) {
                $errmess = "Недопустимая запись E-Mail адреса.";
				$errcode = 2; break;
            }
            if( strlen($passw) < 6 )  { 
                $errmess = "Длинна пароля не может быть меньше 6-ти символов.";
				$errcode = 2; break;
            }
            if( $passw != $passw_re ) {
                $errmess = "'Пароль' и 'Пароль(повторно)' не совпадают.";
				$errcode = 2; break;
            } 
			$phone = preg_replace("/[^0-9]/", '', $phone );
            if( strlen($phone) != 10 ) {
                $errmess = "Номер телефона указан неверно.";
				$errcode = 2; break;
            } 
            
// Проверяем существование
            $sqlreq = "SELECT COUNT(*) AS count FROM customers WHERE email=".$db->quote($email).
						" AND cust_id <> ".$db->quote($cust_id);
            $recset = $db->query( $sqlreq );
            $row = $recset->fetch(PDO::FETCH_ASSOC);
            $count = $row['count'];
            $recset->closeCursor();
            if ($count > 0) {
                $errmess = "Извините. Пользователь с указанным E-Mail адресом уже существует.";
				$errcode = 2; break;
            }

            $mdsum = md5( $email );
            $passw = md5( $passw );
            
            $sqlreq = "UPDATE customers SET ".
					"uname=".$db->quote($uname).",".
					"email=".$db->quote($email).",".
					"passw=".$db->quote($passw).",".
					"phone=".$db->quote($phone).",".
					"mdsum=".$db->quote($mdsum)." ".
					"WHERE cust_id=".$db->quote($cust_id);

            if( $db->exec($sqlreq) === false ){
                $errmess = self::$error;
				$errcode = 1; break;
            }

            $data = "Ваши регистрационные данные успешно обновлены";
            break;
        }

        Tools::json_response( $errmess, $errcode, $data );            
        return;
    }

    public function AdminMail()
    {

        $uname    = isset($_REQUEST["uname"]) ? strip_tags($_REQUEST["uname"]) : '';
        $email    = isset($_REQUEST["email"]) ? strip_tags($_REQUEST["email"]) : '';
        $text     = isset($_REQUEST["text"])  ? strip_tags($_REQUEST["text"])  : '';
        $captcha  = isset($_REQUEST["captcha"]) ? strip_tags($_REQUEST["captcha"]) : '';

        $errmess = "";
		$errcode = 0;
        $data = "";
        
        while (true)
        {
            if( !$uname || !$email || !$text || !$captcha ) {
                $errmess = "Все поля обязательны для заполнения.";
				$errcode = 2;
                break;
            }

            $email = strtolower( $email );
            if( !Tools::is_mail_address( $email ) ) {
                $errmess = "Недопустимая запись E-Mail адреса.";
				$errcode = 2; break;
            }
            $captcha = strtolower( $captcha );
            if( $captcha != $_SESSION['secpic'] ) { 
                $errmess = "Неверно указазан код, показанный на картинке." ;
				$errcode = 2; break;
            }
            
            $sitename = $_SESSION['sitename'];
            
            $mbody = 'Отправитель: "'.$uname.'" <'.$email.">\r\n************** Пишет ***************\r\n".$text;
			
            if( preg_match("/.*\s\<(.*)\>$/", $_SESSION['sitemail'], $matches) )
                $sitemail = $matches[1];
            else
                $sitemail = $_SESSION['sitemail'];
                
            $headers  = 'MIME-Version: 1.0'."\r\n".
                        'Content-type: text/plain; charset=UTF-8'."\r\n".
                        "From: ".$_SESSION['sitemail']."\r\n";
  
            $mres = mail(
                $_SESSION['adminmail'], 
                '=?UTF-8?B?'.base64_encode("Сообщение с сайта $sitename").'?=', 
                $mbody, 
                $headers,
                "-f".$sitemail
            );
          
//            Tools::mail_utf8( $email, "Подтверждение регистрации", $mbody, $headers );
            if( $mres )            
				$data = "На адрес администратора сайта выслано Ваше сообщение<br>".
						"В случае необходимости, на указанный Вами E-Mail адрес<br>".
						"будет выслано ответное соощение.";
			else
				$data = "Ошибка при отправке почты.";							
                    
            break;
        }

        Tools::json_response( $errmess, $errcode, $data );            
        return;
    }

} // End of Customer 

?>
